package com.strange3.utils.commands
{
	import com.strange3.utils.activables.ActivableComponentEvent;
	import com.strange3.utils.modules.ModuleLoadableContentCreator;
	import com.strange3.designpatterns.behavioral.command.ICommand;
	
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	[Event(name="modulesSwitched", type="SwitchModuleCommandEvent")]
	public class SwitchModuleCommand extends EventDispatcher implements ICommand
	{		

		private var _oldModule:ModuleLoadableContentCreator;
		private var _newModule:ModuleLoadableContentCreator;
		
		public function SwitchModuleCommand(oldModule:ModuleLoadableContentCreator, newModule:ModuleLoadableContentCreator) {
			_oldModule = oldModule;
			_newModule = newModule;
		}
		
		public function execute():void {
			
			// sprawdzamy czy zostala zaladowana zawartosc noweg modulu, ktory
			// chcemy odpalic
			if(_newModule.contentLoaded) {
				// tak, mozemy odpalic procedure deaktywacji starego modulu
				this.deactivateOldModuleRoutine();
			} else {
				
				// nie, musimy poczekac na zaladowanie sie nowego modulu
				_newModule.addEventListener(Event.COMPLETE, onNewModuleLoaded);				
			}

		}

		private function onNewModuleLoaded(e:Event):void {
			// usuwamy niepotrzebny listener
			(e.target as ModuleLoadableContentCreator).removeEventListener(Event.COMPLETE, onNewModuleLoaded);
			
			// zaadowal sie dowy modul, mozemy dzialac dalej
			this.deactivateOldModuleRoutine();
		}
		
		protected function deactivateOldModuleRoutine():void {
			
			// czy wogole byl jakis modul wczesniej ?
			
			if(_oldModule) {
				
				// tak, dzialamy procedura deaktywujaca
				_oldModule.addEventListener(ActivableComponentEvent.DEACTIVATED, onOldDeactivated);
				_oldModule.deactivate();
					
			} else {
				
				// nie, musimy po prostu odpalic funkcje aktywujaca nowyt modul
				this.oldDeactivatedRoutine();
			}
			
		}
		
		private function onOldDeactivated(e:ActivableComponentEvent):void {
			
			/* 
			*	ZAJEBISCIE wazne !!
			* Usuwamy niepotrzebny listener. Inaczej bedziemy mieli mase nasluchiwan
			* pomiedzy przelaczeniem roznych czpterow - kopmletnie bez sensu. To byl podstawowy blad w pierwszych wersjach biblioteki
			*/
			(e.target as ModuleLoadableContentCreator).removeEventListener(ActivableComponentEvent.DEACTIVATED, onOldDeactivated);
			
			this.oldDeactivatedRoutine();
			
		}
		
		private function oldDeactivatedRoutine():void {
			// stary modul zostal zdeaktywowany, mozemy aktywowac nowy			
			_newModule.activate();
			
			// wysylamy rowniez informacje z tego modulu, informujaca, ze zosala dokonana
			// zamiana modulow. Nowy modul wlasnie jest w stanie aktywacji
			this.dispatchEvent(new SwitchModuleCommandEvent(SwitchModuleCommandEvent.MODULES_SWITCHED, _newModule));	
		}
				
		
		public function unExecute():void {
			
		}

	}
}